package managed.bean;

import com.marlboroug.articles.ArticlesManagerRemote;
import com.marlboroug.categories.CategoriesManagerRemote;
import com.marlboroug.editors.EditorsManagerRemote;
import com.marlboroug.entity.Articles;
import com.marlboroug.entity.Categories;
import com.marlboroug.entity.Editors;
import com.marlboroug.entity.Parameters;
import com.marlboroug.parameters.ParametersManagerRemote;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/**
 * Gestion des livres.
 *
 * @author Cyril Schumacher
 */
@ManagedBean
@SessionScoped
public class LibraryManager {
    // <editor-fold defaultstate="collapsed" desc="Membres.">
    /**
     * Gestion des paramètres
     */
    @EJB
    private ParametersManagerRemote _parametersManager;
    /**
     * Gestion des articles.
     */
    @EJB
    private ArticlesManagerRemote _articlesManager;
    /**
     * Gestion des articles.
     */
    @EJB
    private EditorsManagerRemote _editorsManager;
    /**
     * Gestion des articles.
     */
    @EJB
    private CategoriesManagerRemote _categoriesManager;
    /**
     * Paramètre.
     */
    private Parameters _paramaters;
    /**
     * Livre sélectionné par l'utilisateur.
     */
    private Articles _article;
    /**
     * Liste de livres.
     */
    private List<Articles> _articles;
    /**
     * Liste des éditeurs.
     */
    private List<Editors> _editors;
    /**
     * Liste des catégories.
     */
    private List<Categories> _categories;
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Accesseurs/Mutateurs.">
    /**
     * Obtient le paramètre.
     *
     * @return Retourne le paramètre.
     */
    public Parameters getParamaters() {
        return _paramaters;
    }

    /**
     * Définit le paramètre.
     *
     * @param _paramaters Paramètre.
     */
    public void setParamaters(Parameters _paramaters) {
        this._paramaters = _paramaters;
    }

    /**
     * Obtient une liste de livres.
     *
     * @return
     */
    public List<Articles> getArticles() {
        return _articles;
    }

    /**
     * Obtient l'article sélectionné par l'utilisateur.
     *
     * @return Retourne l'article.
     */
    public Articles getArticle() {
        return _article;
    }

    /**
     * Définit l'article sélectionné par l'utilisateur.
     *
     * @param _article Article.
     */
    public void setArticle(Articles _article) {
        this._article = _article;
    }

    /**
     * Obtient la liste des éditeurs.
     *
     * @return Retourne une liste.
     */
    public List<Editors> getEditors() {
        return _editors;
    }

    /**
     * Obtient la liste des catégories.
     *
     * @return Retourne une liste.
     */
    public List<Categories> getCategories() {
        return _categories;
    }

    /**
     * Affiche les notifications.
     *
     * @return Retourne une liste d'article.
     */
    public List<Articles> getNotificationsArticles() {
        List<Articles> articles = new ArrayList<>();
        for (Articles article : _articlesManager.findAll()) {
            if ((article.getQuantityStock() == 0) || (article.getQuantityStock() < article.getLimitStock())) {
                articles.add(article);
            }
        }

        return articles;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Méthodes.">
    // <editor-fold defaultstate="collapsed" desc="Privées.">
    /**
     * Rafraîchit la liste des livres.
     */
    public void _refresh() {
        // Récupère la liste des livres selon l'identifiant de la catégorie.
        List<Articles> articles = _articlesManager.findAll();
        _articles = _deleteArticleSupressed(articles);
    }

    /**
     * Supprime les livres ayant un status "Supprimer".
     */
    private List<Articles> _deleteArticleSupressed(List<Articles> articles) {
        for (int i = 0; i < articles.size(); i++) {
            if (articles.get(i).getState() == 5) {
                articles.remove(i);
            }
        }

        return articles;
    }
    // </editor-fold>

    /**
     * Modifie le paramètre.
     */
    public void updateParameter() {
        if (_paramaters.getArticlePage() >= 1) {
            if (_parametersManager.update(_paramaters) == false) {
                // Récupère les informations contextuelles associées au traitement 
                // de la requête pour pouvoir gérer les erreurs/informations.
                FacesContext context = FacesContext.getCurrentInstance();
                // Si l'utilisateur n'a pas pu être créer, on signale l'erreur à 
                // l'utilisateur.
                context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Une erreur est survenue lors de la modification.", null));
            }
        } else {
            // Récupère les informations contextuelles associées au traitement 
            // de la requête pour pouvoir gérer les erreurs/informations.
            FacesContext context = FacesContext.getCurrentInstance();
            // Si l'utilisateur n'a pas pu être créer, on signale l'erreur à 
            // l'utilisateur.
            context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Le nombre de livre par page doit être supérieur à 0.", null));
        }
    }

    /**
     * Sélectionne un livre pour modification.
     *
     * @param article Article.
     * @return Retourne
     */
    public String selectArticle(Articles article) {
        _article = article;
        return "success";
    }

    /**
     * Supprime un livre.
     *
     * @param article Livre.
     */
    public void delete(Articles article) {
        article.setState(5);
        _articlesManager.update(article);
        _refresh();
    }

    /**
     * Met à jour un livre.
     *
     * @return Retourne "success" si la mise à jour s'est bien effectué, FALSE
     * sinon.
     */
    public String update() {
        if (_articlesManager.update(getArticle()) == true) {
            return "success";
        } else {
            _refresh();
            setArticle(new Articles());

            // Récupère les informations contextuelles associées au traitement 
            // de la requête pour pouvoir gérer les erreurs/informations.
            FacesContext context = FacesContext.getCurrentInstance();
            // Si l'utilisateur n'a pas pu être créer, on signale l'erreur à 
            // l'utilisateur.
            context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Une erreur est survenue lors de la mise à jour.", null));
            return "failure";
        }
    }

    /**
     * Créer un livre.
     *
     * @return Retourne "success" si la mise à jour s'est bien effectué, FALSE
     * sinon.
     */
    public String create() {
        Articles article = getArticle();
        if (article.getQuantityStock() == 0) {
            article.setQuantityStock(20);
        }
        if (article.getLimitStock() == 0) {
            article.setLimitStock(5);
        }

        if (_articlesManager.create(article) == true) {
            return "success";
        } else {
            _refresh();
            setArticle(new Articles());

            // Récupère les informations contextuelles associées au traitement 
            // de la requête pour pouvoir gérer les erreurs/informations.
            FacesContext context = FacesContext.getCurrentInstance();
            // Si l'utilisateur n'a pas pu être créer, on signale l'erreur à 
            // l'utilisateur.
            context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Une erreur est survenue lors de la création.", null));
            return "failure";
        }
    }

    /**
     * Initialise la classe.
     */
    @PostConstruct
    public void initialize() {
        _paramaters = _parametersManager.find(1L);
        _editors = _editorsManager.findAll();
        _categories = _categoriesManager.findAll();

        // Initialise un article.
        _article = new Articles();
        _article.setIdEditors(new Editors());
        _article.setIdCategories(new Categories());

        _refresh();
    }
    // </editor-fold>
}
